package main.Primavera;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.*;
import org.jdom2.Document;
import org.jdom2.input.*;
import org.jdom2.output.*;

import javax.swing.*;


public class ConfigXML {

    private int id;
    public static ArrayList<ArrayList<String>> servlist;
    public static DefaultComboBoxModel serverListBoxModel;

    public void createConfig() throws URISyntaxException, IOException {
        File file = new File("DBconfig.xml");
        if (!file.exists()) {
            file.createNewFile();
        } else {
            ConfigXML configXML = new ConfigXML();
            configXML.getConfig();
        }
    }

    //region Добавление новой конфигурации сервера в конец XML-файла
    public void addConfig(String NameDB, String Path, int Port) {

        ArrayList<ArrayList<String>> serverArray;
        serverArray = getConfig();

        //Рут XML
        org.jdom2.Element serverList = new org.jdom2.Element("serverList");
        Document document = new Document(serverList);

        //region Вносим предыдущие элементы
        if (serverArray.size() != 0) {
            for (int i = 0; i < serverArray.size(); i++) {
                org.jdom2.Element server = new org.jdom2.Element("server");
                server.setAttribute("id", String.valueOf(i));
                server.addContent(new org.jdom2.Element("servername").setText(serverArray.get(i).get(0)));
                server.addContent(new org.jdom2.Element("serverpath").setText(serverArray.get(i).get(1)));
                server.addContent(new org.jdom2.Element("serverport").setText(serverArray.get(i).get(2)));
                server.addContent(new org.jdom2.Element("serverdef").setText(serverArray.get(i).get(3)));
                document.getRootElement().addContent(server);
            }
        }
        //endregion
        org.jdom2.Element server1 = new org.jdom2.Element("server");

        //region Добавление параметров в сервер
        server1.setAttribute("id", String.valueOf(serverArray.size() + 1));
        server1.addContent(new org.jdom2.Element("servername").setText(NameDB));
        server1.addContent(new org.jdom2.Element("serverpath").setText(Path));
        server1.addContent(new org.jdom2.Element("serverport").setText(String.valueOf(Port)));
        server1.addContent(new org.jdom2.Element("serverdef").setText("false"));

        document.getRootElement().addContent(server1);
        //endregion

        try {
            XMLOutputter outputter = new XMLOutputter();
            outputter.setFormat(Format.getPrettyFormat());
            FileWriter fw = new FileWriter("DBconfig.xml");
            outputter.output(document, fw);
            fw.close();
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
    //endregion

    //region Редактирование выбранной конфигурации сервера
    public void editConfig(String oldNameDB, String NameDB, String Path, int Port) {

        ArrayList<ArrayList<String>> serverArray;
        serverArray = getConfig();

        //Рут XML
        org.jdom2.Element serverList = new org.jdom2.Element("serverList");
        Document document = new Document(serverList);

        //Вносим предыдущие элементы

        if (serverArray.size() != 0) {
            for (int i = 0; i < serverArray.size(); i++) {
                org.jdom2.Element server = new org.jdom2.Element("server");
                server.setAttribute("id", String.valueOf(i));
                if (oldNameDB.equals(serverArray.get(i).get(0))) {
                    server.addContent(new org.jdom2.Element("servername").setText(NameDB));
                    server.addContent(new org.jdom2.Element("serverpath").setText(Path));
                    server.addContent(new org.jdom2.Element("serverport").setText(String.valueOf(Port)));
                    server.addContent(new org.jdom2.Element("serverdef").setText(serverArray.get(i).get(3)));
                } else {
                    server.addContent(new org.jdom2.Element("servername").setText(serverArray.get(i).get(0)));
                    server.addContent(new org.jdom2.Element("serverpath").setText(serverArray.get(i).get(1)));
                    server.addContent(new org.jdom2.Element("serverport").setText(serverArray.get(i).get(2)));
                    server.addContent(new org.jdom2.Element("serverdef").setText(serverArray.get(i).get(3)));
                }
                document.getRootElement().addContent(server);
            }
        }

        try {
            XMLOutputter outputter = new XMLOutputter();
            outputter.setFormat(Format.getPrettyFormat());
            FileWriter fw = new FileWriter("DBconfig.xml");
            outputter.output(document, fw);
            fw.close();
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
    //endregion

    //Получить параметры выбранного сервера
    public String[] getChooseConfig(String server_name) {
        ArrayList<ArrayList<String>> curServer = getConfig();
        System.out.println("Размер массива: " + curServer.size());
        String[] servSetting = new String[3];
        if (curServer.size() == 0) {

        } else {
            for (int i = 0; i < curServer.size(); i++) {
                if (curServer.get(i).get(0).equals(server_name)) {
                    servSetting[0] = curServer.get(i).get(0);
                    servSetting[1] = curServer.get(i).get(1);
                    servSetting[2] = curServer.get(i).get(2);
                }
            }
        }
        return servSetting;
    }

    //Получить данные по дефолтному серверу
    public String[] getCurConfig() {
        ArrayList<ArrayList<String>> curServer = getConfig();
        String[] servSetting = new String[3];
        for (int i = 0; i < curServer.size(); i++) {
            if (curServer.get(i).get(3).equals("true")) {
                servSetting[0] = curServer.get(i).get(0);
                servSetting[1] = curServer.get(i).get(1);
                servSetting[2] = curServer.get(i).get(2);
            }
        }
        return servSetting;
    }

    //Получить все конфигурации
    public ArrayList getConfig() {
        File file = new File("DBconfig.xml");
        servlist = new ArrayList<>();
        if (file.exists()) {
            SAXBuilder saxBuilder = new SAXBuilder();
            if (file.length() > 0) {
                try {

                    Document document = saxBuilder.build(file);
                    org.jdom2.Element rootNode = document.getRootElement();
                    org.jdom2.Element root = document.getRootElement();
                    List<org.jdom2.Element> serverList = root.getChildren();

                    for (org.jdom2.Element serverConfig : serverList) {
                        id = servlist.size();
                        servlist.add(new ArrayList<String>());
                        parseChild(serverConfig);
                    }

                } catch (JDOMException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return servlist;
    }

    private void parseChild(org.jdom2.Element element) {
        List<org.jdom2.Element> children = element.getChildren();

        for(org.jdom2.Element child : children) {
            servlist.get(id).add(child.getTextTrim());
        }
    }

    //Удаление одной конфигурации сервера
    public void deleteConfig(String server_name) {

        System.out.println(server_name);

        ArrayList<ArrayList<String>> serverArray;
        serverArray = getConfig();

        //Рут XML
        org.jdom2.Element serverList = new org.jdom2.Element("serverList");
        Document document = new Document(serverList);

        //Вносим предыдущие элементы

        if (serverArray.size() != 0) {
            for (int i = 0; i < serverArray.size(); i++) {
                System.out.println(serverArray.get(i).get(0));
                if (!serverArray.get(i).get(0).equals(server_name)) {
                    org.jdom2.Element server = new org.jdom2.Element("server");
                    server.setAttribute("id", String.valueOf(i));
                    server.addContent(new org.jdom2.Element("servername").setText(serverArray.get(i).get(0)));
                    server.addContent(new org.jdom2.Element("serverpath").setText(serverArray.get(i).get(1)));
                    server.addContent(new org.jdom2.Element("serverport").setText(serverArray.get(i).get(2)));
                    server.addContent(new org.jdom2.Element("serverdef").setText(serverArray.get(i).get(3)));
                    document.getRootElement().addContent(server);
                }
            }
        }
        org.jdom2.Element server1 = new org.jdom2.Element("server");
        //Добавление параметров в сервер

        try {
            XMLOutputter outputter = new XMLOutputter();
            outputter.setFormat(Format.getPrettyFormat());
            FileWriter fw = new FileWriter("DBconfig.xml");
            outputter.output(document, fw);
            fw.close();
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
        }

    }

    //Компонента выпадающего списка серверов
    public DefaultComboBoxModel serverListBoxModel() {
        serverListBoxModel = new DefaultComboBoxModel();
        ArrayList<ArrayList<String>> serverList;
        serverList = getConfig();
        int listItem = serverList.size();
        for (int i = 0; i < listItem; i++) {
            serverListBoxModel.addElement(serverList.get(i).get(0));
        }

        return serverListBoxModel;
    }

    public void setBoxElement (String boxElement) {
        DefaultComboBoxModel model = serverListBoxModel();
        System.out.println(model.getSize());
        model.insertElementAt(boxElement, model.getSize());
        for (int i = 0; i < model.getSize(); i++) {
            System.out.println(i + " | " + model.getElementAt(i));
        }
    }

    //Компонента списка серверов
    public DefaultListModel serverListJList() {
        DefaultListModel serverListItem;
        serverListItem = new DefaultListModel();
        ArrayList<ArrayList<String>> serverList;
        serverList = getConfig();
        int listItem = serverList.size();
        for (int i = 0; i < listItem; i++) {
            serverListItem.addElement(serverList.get(i).get(0));
        }
        return serverListItem;
    }

}